其他
深度学习火了那么多年,到底怎么搞?使用Numpy快速入门
深度学习基础知识 Numpy实现神经网络构建和梯度下降算法 计算机视觉领域主要方向的原理、实践 自然语言处理领域主要方向的原理、实践 个性化推荐算法的原理、实践
人工智能、机器学习、深度学习三者的关系,并简要介绍了深度学习的发展历史以及未来趋势。 介绍构建深度模型的五个步骤,并使用Numpy实现神经网络。 原理介绍和代码实践并行,详细介绍了使用Numpy实现梯度下降算法。
深度学习介绍
对于深度学习初学者来说,容易遇到三个入门级问题:
人工智能、机器学习、深度学习三者之间关系是什么? 一般的机器学习方法是什么? 为什么那么多人看好深度学习,其未来的发展趋势是什么?
用Python搭建神经网络
实践出真知,理论知识说得天花乱坠也不如多写几行代码,接下来将介绍使用Numpy构建神经网络、实现梯度下降的具体方法。本次实验实现波士顿房价预测的回归模型。应用于不同场景的深度学习模型具备一定的通用性,均分为五个步骤来完成模型的构建和训练,使用Numpy实现神经网络也不外乎如此,步骤如下:
数据处理:从本地文件或网络地址读取数据,并做预处理操作,如校验数据的正确性等。 模型设计:完成网络结构的设计(模型要素1),相当于模型的假设空间,即模型能够表达的关系集合。 训练配置:设定模型采用的寻解算法(模型要素2),即优化器,并指定计算资源。 训练过程:循环调用训练过程,每轮均包括前向计算 、损失函数(优化目标,模型要素3)和后向传播这三个步骤。 保存模型:将训练好的模型保存,以备预测时调用。
def load_data():
# 从文件导入数据
datafile = './work/housing.data'
data = np.fromfile(datafile, sep=' ')
# 每条数据包括14项,其中前面13项是影响因素,第14项是相应的房屋价格中位数
feature_names = [ 'CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', \
'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV' ]
feature_num = len(feature_names)
# 将原始数据进行Reshape,变成[N, 14]这样的形状
data = data.reshape([data.shape[0] // feature_num, feature_num])
# 将原数据集拆分成训练集和测试集
# 这里使用80%的数据做训练,20%的数据做测试
# 测试集和训练集必须是没有交集的
ratio = 0.8
offset = int(data.shape[0] * ratio)
training_data = data[:offset]
# 计算train数据集的最大值,最小值,平均值
maximums, minimums, avgs = training_data.max(axis=0), training_data.min(axis=0), \
training_data.sum(axis=0) / training_data.shape[0]
# 对数据进行归一化处理
for i in range(feature_num):
#print(maximums[i], minimums[i], avgs[i])
data[:, i] = (data[:, i] - avgs[i]) / (maximums[i] - minimums[i])
# 训练集和测试集的划分比例
training_data = data[:offset]
test_data = data[offset:]
return training_data, test_data
构建神经网络
将波士顿房价预测输出的过程以“类和对象”的方式来描述,实现的方案如下所示。类成员变量有参数 w 和 b,并写了一个forward函数(代表“前向计算”)完成上述从特征和参数到输出预测值的计算过程。
目前已经实现了房价预测模型的前向过程,但是如何知道预测的结果呢,假设预测值为而真是房价为,这时我们需要有某种指标来衡量预测值跟真实值之间的差距。对于回归问题,最常采用的衡量方法是使用均方误差作为评价模型好坏的指标,具体定义如下:上式中的(简记为: ) 通常也被称作损失函数,它是衡量模型好坏的指标,在回归问题中均方误差是一种比较常见的形式。由于实现的房价预测模型的权重是随机初始化的,这个权重参数处在模型极小值的概率几乎为0,我们需要使用梯度下降算法不断更新权重,直到该权重处于模型的极小值或最小值附近。随机的选一组初始值,例如: 选取下一个点使得 重复上面的步骤2,直到损失函数几乎不再下降
def gradient(self, x, y):
z = self.forward(x)
gradient_w = (z-y)*x
gradient_w = np.mean(gradient_w, axis=0)
gradient_w = gradient_w[:, np.newaxis]
gradient_b = (z - y)
gradient_b = np.mean(gradient_b)
return gradient_w, gradient_b
def update(self, graident_w5, gradient_w9, eta=0.01):
net.w[5] = net.w[5] - eta * gradient_w5
net.w[9] = net.w[9] - eta * gradient_w9
def train(self, x, y, iterations=100, eta=0.01):
points = []
losses = []
for i in range(iterations):
points.append([net.w[5][0], net.w[9][0]])
z = self.forward(x)
L = self.loss(z, y)
gradient_w, gradient_b = self.gradient(x, y)
gradient_w5 = gradient_w[5][0]
gradient_w9 = gradient_w[9][0]
self.update(gradient_w5, gradient_w9, eta)
losses.append(L)
if i % 50 == 0:
print('iter {}, point {}, loss {}'.format(i, [net.w[5][0], net.w[9][0]], L))
return points, losses
运行代码后,从下面这个图里可以清晰的看到损失函数的下降过程。图5:损失函数下降过程总结一下,本文以机器学习深度学习概述开篇,讲解了深度学习的基础知识,通过使用Numpy实现房价预测模型,详细讲解了构建深度学习模型的五个步骤,以及梯度下降的基本原理、如何使用Numpy实现梯度下降等内容,希望对你入门深度学习有帮助。